home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / temacd / audacity / audacity-win-unicode-1.3.2.exe / {app} / Plug-Ins / SilenceMarker.ny < prev    next >
Lisp/Scheme  |  2005-11-20  |  4KB  |  107 lines

  1. ;nyquist plug-in
  2. ;version 1
  3. ;type analyze
  4. ;name "Silence Finder..."
  5. ;action "Finding silence..."
  6. ;info "Silence finder written by Alex S. Brown, PMP (http://www.alexsbrown.com)\nVersion 1.0 released Apr 3 2005 under the GPL license\n(http://www.opensource.org/licenses/gpl-license.php)
  7. ;control sil-lev "Silence level" real "dB" 26 0 100
  8. ;control sil-dur "Minimum silence duration" real "seconds" 1.5 0.1 5.0
  9. ;control labelbeforedur "Place label" real "seconds before silence ends" 0.3 0.0 1.0
  10.  
  11. ;Create a function to make the sum the two channels if they are stereo
  12. (defun mono-s (s-in) (if (arrayp s-in) (snd-add (aref s-in 0) (aref s-in 1))
  13. s-in))
  14.  
  15. ;Create a function to reduce the sample rate and prepare the signal for
  16. ;analysis. RMS is good to monitor volume the way humans hear it, but is not
  17. ;available in Audacity. Used a peak-calculating function instead.
  18. ;NOTE: this is the place to add any processing to improve the quality of the
  19. ;signal. Noise filters could improve the quality of matches for noisy signals.
  20. ;PERFORMANCE vs. ACCURACY
  21. ;Reducing the samples per second should improve the performance and decrease
  22. ;the accuracy of the labels. Increasing the samples per second will do the
  23. ;opposite. The more samples checked, the longer it takes. The more samples
  24. ;checked, the more precisely the program can place the silence labels.
  25. ;my-srate-ratio determines the number of samples in my-s. Set the number after (snd-srate s)
  26. ;higher to increase the number of samples.
  27.  
  28. (defun my-s (s-in)
  29.  (setq my-srate-ratio (truncate (/ (snd-srate (mono-s s-in)) 100)))
  30.  (snd-avg (mono-s s-in) my-srate-ratio my-srate-ratio OP-PEAK)
  31. )
  32.  
  33. ;Set the silence threshold level (convert it to a linear form)
  34. (setq thres (db-to-linear (* -1 sil-lev)))
  35. ;Store the sample rate of the sound
  36. (setq s1-srate (snd-srate (my-s s)))
  37. ;Initialize the variable that will hold the length of the sound.
  38. ;Do not calculate it now with snd-length, because it would waste memory.
  39. ;We will calculate it later.
  40. (setq s1-length 0)
  41. ;Initialize the silence counter and the labels variable
  42. (setq sil-c 0)
  43. (setq l NIL)
  44. ;Convert the silence duration in seconds to a length in samples
  45. (setq sil-length (* sil-dur s1-srate))
  46.  
  47. ;Define a function to add new items to the list of labels
  48. (defun add-label (l-time l-text)
  49.  (setq l (cons (list l-time l-text) l))
  50. )
  51.  
  52. ;The main working part of the program, it counts
  53. ;the number of sequential samples with volume under
  54. ;the threshold. It adds to a list of markers ever time
  55. ;there is a longer period of silence than the silence
  56. ;duration amount.
  57.  
  58. ;It runs through a loop, adding to the list of markers (l)
  59. ;each time it finds silence.
  60. (let (s1) ;Define s1 as a local variable to allow efficient memory use
  61.  ; Get the sample into s1, then free s to save memory
  62.  (setq s1 (my-s s))
  63.  (setq s nil)
  64.  ;Capture the result of this "do" loop, because we need the sountd's legnth
  65.  ;in samples.
  66.  (setq s1-length
  67.   ;Keep repeating, incrementing the counter and getting another sample
  68.   ;each time through the loop.
  69.   (do ((n 1 (+ n 1)) (v (snd-fetch s1) (setq v (snd-fetch s1))))
  70.    ;Exit when we run out of samples (v is nil) and return the number of
  71.    ;samples processed (n)
  72.    ((not v) n)
  73.    ;Start the execution part of the do loop
  74.    ;if found silence, increment the silence counter
  75.    (if (< v thres) (setq sil-c (+ sil-c 1)))
  76.  
  77.    ;If this sample is NOT silent and the previous samples were silent
  78.    ;then mark the passage.
  79.    (if (and (> v thres) (> sil-c sil-length))
  80.        ;Mark the user-set number of seconds BEFORE this point to avoid clipping the start
  81.        ;of the material.
  82.     (add-label (- (/ n s1-srate) labelbeforedur) "S")
  83.    )
  84.    ;If this sample is NOT silent, then reset the silence counter
  85.    (if (> v thres)
  86.     (setq sil-c 0)
  87.    )
  88.   )
  89.  )
  90. )
  91.  
  92. ;Check for a long period of silence at the end
  93. ;of the sample. If so, then mark it.
  94. (if (> sil-c sil-length)
  95.  ;If found, add a label
  96.  ;Label time is the time the silence began plus the silence duration target
  97.  ;amount. We calculate the time the silence began as the end-time minus the
  98.  ;final value of the silence counter
  99.  (add-label (+ (/ (- s1-length sil-c) s1-srate) sil-dur) "S")
  100. )
  101.  
  102. ;If no silence markers were found, return a message
  103. (if (null l)
  104.  (setq l "No silence found, no passages marked")
  105. )
  106. l
  107.